type IUtil_Index_RandomString_Arguements = {
  length: number;
  character?: string;
};
/**
 * @description 生成指定长度的随机字符串，可以使用给定的字符集。
 * @example
 * // 使用默认字符集生成长度为10的随机字符串
 * const randomString = util_Index_RandomString(10);
 * @example
 * // 使用自定义字符集生成长度为8的随机字符串
 * const customRandomString = util_Index_RandomString(8, 'abcdef');
 * @param {any} data - 要包装的内容。
 * @param {number} data.length - 要生成的随机字符串的长度。
 * @param {string} [data.character] - 可选参数。包含用于生成随机字符串的字符集。如果未提供，将使用默认的字母和数字字符集。
 * @returns {string} - 生成的随机字符串。
 */
export function util_Index_RandomString({
  length,
  character,
}: IUtil_Index_RandomString_Arguements): string {
  const characters = character || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  const charactersLength = characters.length;
  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * charactersLength));
  }
  return result;
}

/**
 * @description 将传入的内容包装在一个对象中并返回。
 * @example
 * // 将数字内容包装在对象中
 * const result = await util_Index_ReturnContent<number>(123);
 * console.log(result); // 输出: { content: 123 }
 * @template T - 内容的类型。
 * @param {T} data - 要包装的内容。
 * @returns {Promise<{ content: T }>} - 一个包含内容的对象，类型为 `Promise<{ content: T }>`。
 */
export async function util_Index_ReturnContent<T>(data: T): Promise<{ data: T }> {
  return { data: data as T };
}

/**
 * @description 解析时间并根据指定的格式返回字符串。
 * @example
 * // 使用时间戳解析时间并返回默认格式的字符串
 * const timeString = util_Index_ParseTime({ time: 1625097600 });
 * console.log(timeString); // 输出: "2021-07-01"
 * @example
 * // 使用时间戳解析时间并返回指定格式的字符串
 * const timeString = util_Index_ParseTime({ time: 1625097600, cFormat: '{y}/{m}/{d} {h}:{i}:{s}' });
 * console.log(timeString); // 输出: "2021/07/01 00:00:00"
 * @example
 * // 使用日期字符串解析时间并返回默认格式的字符串
 * const timeString = util_Index_ParseTime({ time: '2021-07-01' });
 * console.log(timeString); // 输出: "2021-07-01"
 * @param {Object} obj - 包含时间和格式的对象。
 * @param {string | number} obj.time - 要解析的时间，可以是时间戳或日期字符串。
 * @param {string} [obj.cFormat] - 可选参数，指定返回时间字符串的格式，默认为 `{y}-{m}-{d}`。
 * @returns {string | null} - 根据指定格式返回解析后的时间字符串。如果没有传入参数，则返回 ``。
 */
export function util_Index_ParseTime(obj: { time: string | number; cFormat?: string }): string {
  if (arguments.length === 0) {
    return '';
  }
  if ((obj.time + '').length === 10) {
    obj.time = +obj.time * 1000;
  }
  const format = obj.cFormat || '{y}-{m}-{d}';
  let date: any;
  if (typeof obj.time === 'object') {
    date = obj.time;
  } else {
    date = new Date(parseInt(obj.time + ''));
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  };
  const time_str = format.replace(
    /{(y|m|d|h|i|s|a)+}/g,
    (result: string, key: keyof typeof formatObj) => {
      let value: string | number;
      value = formatObj[key] as number;
      if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1];
      if (value < 10) value = '0' + value;
      return value + '' || '0';
    },
  );
  return time_str;
}
